#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

#include "../include.h"

#define PIECE_SIZE 2048
#define MAX_FILENAME 30


//Cf 
/*int taille_fichier(char * file_name){
  FILE * fd = fopen(file_name, "rb");
  fseek(fd, 0, SEEK_END); // Mettre le pointeur à la fin du fichier
  int size = ftell(fd); // Récupérer la valeur du pointeur
  fseek(fd, 0, SEEK_SET); // Remettre le pointeur au début du fichier
  fclose(fd);
  return size;
}
*/
/*
* Fonction qui prend en paramètre un nom de fichier et un entier représentant la taille du fichier à initialiser avec '0'
*/
void init_file(char * file_name, int file_size){
	FILE * pfile = fopen(file_name, "w"); 
	//rewind(pfile);
	int i;
	

	for (i=0; i<file_size; i++)
       fputc('\n', pfile);
       
    fclose(pfile);
}
			
/*
* Fonction qui prend en paramètre un nom de fichier et un entier représentant le numéro du segment du fichier de taille PIECE_SIZE
* Ecrit dans le buffer fourni en paramètre le morceau du fichier numéro "piece_number"
* Retourne le nombre d'octets lus du fichier c-a-d la taille du morceaux du fichier (peut être < PIECE_SIZE)
*/
int split_file(const char * file_name, size_t piece_number, char * buffer){

  int begin = piece_number*PIECE_SIZE;
  size_t bytes_read = 0;
  size_t bytes_written = 0;

  fprintf(stderr,"%s\n",file_name);
  FILE * pfile = fopen(file_name, "rb");
  if(pfile == NULL)
     perror("FILE");

  fseek(pfile, begin, SEEK_SET);
  char piece_name[MAX_FILENAME];
  fflush(stdout);
  bytes_read = fread(buffer, 1, PIECE_SIZE, pfile);
  
  fclose(pfile);
  return bytes_read;
}


/*
* Fonction qui prend en paramètre un nom de fichier, un numéro de morceau d'un autre fichier, un buffer contenant le contenu du morceau en question de taille (<= PIECE_SIZE)
* Ecrit dans le fichier dont le nom est fourni en paramètre le contenu du buffer
*/
void recompose_file(const char * written_file_name, size_t piece_number, char * buffer, size_t bytes_read){
	//on se place
	FILE * pfile = fopen(written_file_name, "ab+");
	if (pfile ==NULL)
	    perror("ERROR : fopen written_file");
	//on calcule l'emplacement du morceau à écrire
	int begin = piece_number*PIECE_SIZE;
	fseek(pfile, begin, SEEK_SET);
	// on ecrit le contenu du buffer dans le fichier
	int bytes_written = fwrite(buffer, 1, bytes_read , pfile);
	
	//free(buffer);
	fclose(pfile);
}


/*int main(){
	int piece = 0;
	char * file_source = "test_split";
	char * file_dest = "test_split2";
	char * buffer = malloc(PIECE_SIZE*sizeof(char));
	
	int file_src_size = taille_fichier(file_source);
	printf("Initilisation du fichier de reception %s de taille %d \n", file_dest, file_src_size);
	init_file(file_dest, file_src_size);
	
	printf("Extraction de la piece n%d du fichier source %s\n", piece, file_source);
	int bytes_read = split_file(file_source, piece, buffer);
	
	printf("Ecriture de la piece n%d du fichier source %s dans le fichier destination %s\n", piece, file_source, file_dest);
	recompose_file(file_dest, piece, buffer, bytes_read);
	
	piece = 2;
	printf("Extraction de la piece n%d du fichier source %s\n", piece, file_source);
	bytes_read = split_file(file_source, piece, buffer);
	
	printf("Ecriture de la piece n%d du fichier source %s dans le fichier destination %s\n", piece, file_source, file_dest);
	recompose_file(file_dest, piece, buffer, bytes_read);
	free(buffer);
	return EXIT_SUCCESS;	
}*/
